﻿/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __2289980F_782F_4a10_A19F_8A161D1A159E__
#define __2289980F_782F_4a10_A19F_8A161D1A159E__

namespace xos_container
{
    class i_container;
}

namespace xos_box
{
    class i_callback;
}

namespace xos_log
{

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // 
    // log object type
    // 
    enum class enumLogObject
    {
        LOG_OBJECT_NONE,
        LOG_OBJECT_LOGGER_DEBUG,
        LOG_OBJECT_LOGGER_FILE,
        LOG_OBJECT_LOGGER_CMD,
        LOG_OBJECT_LOGGER_NET,
        LOG_OBJECT_LOG
    };

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    //
    // 日志信息接口
    // 所有返回的字串长度,都有不包括最后的0
    // 
    class i_log_msg
    {
    public:
        virtual ~i_log_msg()
        {}

    public:
        // 
        // 得到合成后的日志全内容
        // 
        virtual const char * get_log_content( char * lpszLogContent, int nCharNum, int * lpnRetCharNum ) = 0;

        // 
        // 得到日志时间
        // 
        virtual int get_log_time( int * lpnYear,
            int * lpnMonth,
            int * lpnDay,
            int * lpnHour,
            int * lpnMinute,
            int * lpnSeconde,
            int * lpnMilliSecond ) = 0;
    };

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // 
    // 扩展日志输出方式
    // 
    class i_logger : public xos::i_release
    {
    public:
        virtual ~i_logger()
        {}

    public:
        // 输出日志
        virtual int out_put_log( i_log_msg * pLogMsg ) = 0;
        virtual int flush() = 0;
    };

    // 
    // 扩展日志输出方式
    // 
    class i_log_net : public i_logger
    {
    public:
        virtual ~i_log_net()
        {}

    public:
        virtual int set_log_server_info( const char * lpszIp, int ulPort ) = 0;
    };

    // 
    // 扩展日志输出方式
    // 
    class i_log_file : public i_logger
    {
    public:
        virtual ~i_log_file()
        {}

    public:
        virtual int set_log_file_path( const char * lpszLogPath ) = 0;
        // default is 100 * xos_box::i_buf::BUF_SIZE
        virtual int set_buf_num_to_flush( int nBufNum ) = 0;
    };

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // 
    // 日志输出接口
    // 
    class i_log : public xos::i_release
    {
    public:
        virtual ~i_log()
        {}

    public:
        // 
        // 使用日志功能
        // 
        virtual int log_info( const char * lpszName, int ulLevel, const char * lpszCodeFile, int ulCodeLine, const char * lpszFmt, ... ) = 0;
        virtual int flush() = 0;

        // 
        // 设置公共线程，所有日志消息都扔到这个线程中处理。公用线程能节省，少用一些线程，代码也清楚一些
        // 
        virtual int set_work_thread( xos_box::i_callback * pWorkThread ) = 0;

        // 
        // 通过xml字串设置参数,根节点是log_config/logs
        // 这个接口,是为方便将日志配置信息,做为一小部分,放在大的配置文件中的情况
        // 这时,日志的根节点是log_config/logs
        // 
        virtual int set_config_string( const char * lpszConfigString ) = 0;

        // 
        // 通过xml配置文件设置参数,根节点是:log_config/logs这种
        // 
        virtual int set_config_file( const char * lpszConfigFile ) = 0;

        // 
        // 手动设置参数
        // 
        virtual int add_log_module( const char * lpszModuleName, int ulLevel ) = 0;

        // 
        // 添加日志输出方式
        // 
        virtual int create_logger( enumLogObject enumType, void ** ppv ) = 0;
        virtual int add_logger( i_logger * pLogger ) = 0;

        // 
        // 日志开关
        // 
        virtual int enable( bool bEnable ) = 0;
    };

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // 导出函数定义
    // 
    typedef int ( *f_create )( xos_container::i_container * pContainer, i_log ** ppv );

} // xos_log

#endif // __2289980F_782F_4a10_A19F_8A161D1A159E__
